perm filename M11A.F4[P11,LCS]7 blob
sn#454343 filedate 1979-07-03 generic text, type T, neo UTF8
00100 C *** MUSIC V FOR PDP11, AS REVISED BY LELAND SMITH ***
00200 C *********** LIMITS ******************
00300 C 15 INST DEFINITIONS. 20 NOTES PLAYING AT ONCE. 27 DIFFERENT INS. NAMES.
00400 DIMENSION T(50),TI(50),ITI(50)
00500 COMMON /DEVS/ID1,ID21,JTYPE,KIN,KOUT
00600 COMMON I(513) /P/P(50) /FINOUT/JPEAK,IPEAK,NBUF
00700 1 /CONV/ICONV,INIOUT,JFLNM
00800 1 /LFUNC/LFUNC,XNFUN,PINCR /IFIRST/IFIRST,IDT
00900 1 /GENS/GENS(3072) /LOCG/LOCG(6)
01000 DO 10 N1=1,NGENS
01100 10 LOCG(N1)=(N1-1)*LFUNC+1
01200 C ABOVE SETS UP 6 POSSIBLE FUNCS. NUMBER MAY BE INCREASED.
01300 C TO INCREASE NUM. OF GENS AVAILABLE ENLARGE 'GENS' BY 512 PER GEN AND
01400 C PUT PROPER NUMBER INTO 'NGENS' DATA AND 'LOCG' ARRAY SIZE.
01500
01600 C ISRT=DEFAULT SMPL.RATE, LFUNC=FUNC ARRAY LENGTH,
01700 DATA ISRT/10000/, LFUNC/512/, ICONV/-1/,XNFUN/511.0/,NPAR/35/,
01800 1 NINS/27/,RBLK/512.0/,LBLK/512/,NGENS/6/,PFUNC/512.0/,NLIM/700/
01900 C NPAR=NUM. OF PARAMS/INST., NINS=NUM. OF INSTS., RBLK,LBLK=LENGTH OF OUTPUT BLOCKS
02000 C NLIM=NPAR* HOW MANY NOTES CAN PLAY AT ONCE. (NPAR*20=700, RNT SIZE)
02100
02200 COMMON /INS/INS(300),IDEF(15) /NT/RNT(700) /ROUT/ROUT(2560)
02300 C INS=(15)INSTRUMENT DEFINITIONS: EACH INST. CAN USE 15 TO 40+ SLOTS
02400 C IDEF=LOCATION TABLE: 15 INST. DEFS. POSSIBLE AT ONE TIME.
02500 C RNT=PARAM. LIST FOR CURRENTLY PLAYING NOTES. SIZE OF ARRAY SHOULD
02600 C BE A MULTIPLE OF NPAR (35*20 CURRENTLY=20 NOTES CAN PLAY AT ONCE.)
02700 C ***** ONLY 15 DIFFERENT INS NUMBERS CAN BE USED. (1-15) ********
02800 C ROUT=OUTPUT BLOCK (B1→B5)(5*512=2560)(FITS PDP11/70 FORTRAN.)
02900 EQUIVALENCE (I1,I),(I2,I(2)),(T3,T(3)),(T2,T(2)),(P3,P(3)),
03000 1 (P4,P(4)),(I5,I(5)),(I6,I(6)),(I4,I(4)),(P2,P(2)),(I3,I(3))
03100 C SEE BLOCK DATA FOR DEVICE NUMBERS FOR IN-OUT AND TTY.
03200 NBUF=512
03300 1000 INIOUT=-1
03400 C INIOUT IS TO INITIALIZE OUTPUT SYSTEM.
03500 IFIRST=-1
03600 IDT=1
03700 C ABOVE 2 ARE IN TRANS. ROUTINES.
03800 JPEAK=0
03900 IPEAK=0
04000 C IPEAK AND JPEAK USED TO TYPE OUT AMPL. INFO. LATER.
04100 I2=1
04200 IF(SRATE.EQ.0)SRATE=ISRT
04300 CCC IF(I4.EQ.0)I4=ISRT
04400 PINCR=PFUNC/SRATE
04500 CCC PINCR=PFUNC/I4
04600 C ABOVE FOR AUTOMATIC P2 CONVERSION TO DURATION INCR.
04700 MOUT=1
04800
04900 C INITIALIZATION OF SECTION
05000 5 T(1)=0.0
05100 DO 220 N1=1,NLIM,NPAR
05200 C INITS POSSIBLE NUM OF NOTES THAT CAN PLAY AT ONCE (27 NOW)
05300 220 RNT(N1)=-1
05400 DO 221 N1=1,NINS
05500 221 TI(N1)=90909.
05600
05700 C MAIN CARD READING LOOP
05800 204 CALL DATA (ID21)
05900 C ID21 IS A DSK DEVICE NUM.
06000 IF(P(1).NE.1.AND.P(1).NE.6)GO TO 200
06100 C JUMP IF A NOTE OR A FINISH
06200 IF(P2.GT.T(1))GO TO 244
06300 200 IOP=P(1)
06400 IF(IOP)201,201,202
06500 201 CALL ERROR(1)
06600 GO TO 204
06700
06800 202 IF(IOP.GT.12)GO TO 201
06900 C ERROR IF OP CODE IS TOO BIG OR <0.
07000 203 GO TO (1,2,3,4,5,6,7,8,201,201,11,11),IOP
07100 11 IVAR=P3
07200 IVARE=IVAR+I1-4
07300 DO 297 N1=IVAR,IVARE
07400 IVARP=N1-IVAR+4
07500 297 I(N1)=P(IVARP)
07600 C I HOLDS THINGS LIKE SRATE, NCHNS (CHA)
07700 IF(N1.EQ.8)NBUF=512+512*I(N1)
07800 C SET BUFFER SIZE . (512=MONO, 1024=STEREO)
07900 PINCR=PFUNC/SRATE
08000 CCC PINCR=PFUNC/I4
08100 C ABOVE FOR AUTOMATIC P2 CONVERSION TO DURATION INCR.
08200 GO TO 204
08300 3 IGEN=P3
08400 IF(P4.GT.NGENS)PAUSE ' FUNC. NUM. OUT RANGE'
08500 C ERROR 4=FUNC NUMB. OUT OF RANGE.
08600 IF(IGEN.NE.1)GO TO 282
08700 CCC **** ONLY GEN1,GEN2 IN THIS VERSION GO TO (281,282,283,284,285),IGEN
08800 281 CALLGEN1
08900 GO TO 204
09000 282 IF(IGEN.GT.2)PAUSE ' ONLY GEN1 AND GEN2 FOR NOW'
09100 CALLGEN2
09200 GO TO 204
09300 7 IF(P4.LT.1)P4=1
09400 C 'SEG' SEG F A,S A,S ... F=FUNC NUM. A=AMPL. S=STEP (1-100)
09500 DO 430 K=4,I1,2
09600 C CONVERT STEPS 1-100 TO 0-511.
09700 430 P(K)=((P(K)-1.)/99.)*511.
09800 530 DO 630 K=I1,1,-1
09900 630 P(K+2)=P(K)
10000 C ABOVE REFORMATS FOR 'GEN' ROUTINES.
10100 P3=IOP-6
10200 P2=0
10300 I1=I1+2
10400 GO TO 3
10500 8 I1=I1+1
10600 C 'SIN' SIN F AH, AH, ... F=FUNC NUM. AH=AMPL OF THAT HARMONIC.
10700 P(I1)=I1-3
10800 C GET TOTAL NUM. OF HARMONICS
10900 GO TO 530
11000 4 IVAR=P3
11100 IVARE=IVAR+I1-4
11200 DO 296N1=IVAR,IVARE
11300 IVARP=N1-IVAR+4
11400 296 I(N1+100)=P(IVARP)
11500 GO TO 204
11600 6 CALL FROUT3(IDSK)
11700 CCCC STOP
11800 GO TO 1000
11900
12000 C ENTER NOTE TO BE PLAYED
12100 1 DO 230 N1=1,NLIM,NPAR
12200 230 IF(RNT(N1).EQ.-1)GO TO 231
12300 CALL ERROR(2)
12400 C TOO MANY NOTES(27 LIMIT FOR NOW) TRYING TO PLAY AT ONCE.
12500 WRITE(JTYPE,1230)NINS
12600 C JTYPE IS TTY DEVICE NUMBER.
12700 GO TO 204
12800 1230 FORMAT(' TOO MANY NOTES AT ONCE. LIMIT=',I2/)
12900 231 M1=N1
13000 M2=N1+I1-1
13100 M3=M2+1
13200 M4=N1+NPAR-1
13300 DO 232N1=M1,M2
13400 M5=N1-M1+1
13500 232 RNT(N1)=P(M5)
13600 RNT(M1 )=P3
13700 RNT(M1+3)=PINCR/P4
13800 C CONVERTS 'P2' TO PROPER INCREMENT FOR DURATIONS.
13900 IF(M3.GT.M4)GO TO 236
14000 DO 233 N1=M3,M4
14100 233 RNT(N1)=0
14200 236 DO 235 N1=1,NINS
14300 IF(TI(N1)-90909.)235,234,235
14400 234 TI(N1)=P2+P4
14500 ITI(N1)=M1
14600 GO TO 204
14700 235 CONTINUE
14800 CALL ERROR(3)
14900 GO TO 204
15000
15100 C DEFINE INSTRUMENT
15200 2 M1=I2
15300 M2=IFIX(P3)
15400 IF(M2.GT.15)PAUSE ' ***** INS NUMBER IS TOO HIGH.'
15500 IDEF(M2)=M1
15600 218 CALL DATA (ID21)
15700 IF(I1.GT.2)GO TO 211
15800 210 INS(M1)=0
15900 I2=M1+1
16000 C END OF INST. DEF.
16100 GO TO 204
16200 211 INS(M1)=P3
16300 C P3 IS UNIT GENERATOR CODE NUM.
16400 INS(M1+1)=M1+I1-1
16500 C I1 IS WDCNT OF LAST READIN
16600 M1=M1+2
16700 DO 217N1=4,I1
16800 M5=P(N1)
16900 IF(M5)212,213,213
17000 212 IF(M5+100)300,301,301
17100 300 INS(M1)=-1+(M5+101)*LFUNC
17200 GO TO 216
17300 301 INS(M1)=-1+(M5+1)*LBLK
17400 GO TO 216
17500 213 INS(M1)=M5
17600 216 M1=M1+1
17700 217 CONTINUE
17800 GO TO 218
17900
18000 C PLAY TO ACTION TIME
18100 244 T2=P2
18200 250 TMIN=90909.
18300 IREST=1
18400 DO 241N1=1,NINS
18500 IF(TMIN-TI(N1))241,241,240
18600 240 TMIN=TI(N1)
18700 MNOTE=N1
18800 241 CONTINUE
18900 IF(90909.-TMIN)251,251,243
19000 243 IF(TMIN-T2)245,245,246
19100 245 T3=TMIN
19200 GO TO 260
19300 246 T3=T2
19400 GO TO 260
19500 247 IF(T(1)-T2)249,200,200
19600 249 TI(MNOTE)=90909.
19700 M2=ITI(MNOTE)
19800 RNT(M2)=-1
19900 GO TO 250
20000
20100 C SETUP REST
20200 251 T3=T2
20300 IREST=2
20400 GO TO 260
20500
20600 C PLAY
20700 260 SMPLS=(T3-T(1))*SRATE
20800 C SMPLS MUST BE FLOATING PT. (OR DOUBLE PRECISION)
20900 CCC 260 ISAM=(T3-T(1))*FLOAT(I4)+.5
21000 T(1)=T3
21100 IF(SMPLS.LE.0.5)GO TO 247
21200 266 IF(SMPLS-RBLK.GT.0.5)GO TO 263
21300 262 I5=SMPLS
21400 SMPLS=0
21500 CCC IF(ISAM)247,247,266
21600 CCC 266 IF(ISAM-LBLK)262,262,263
21700 CCC 262 I5=ISAM
21800 CCC ISAM=0
21900 GO TO 264
22000 263 I5=LBLK
22100 SMPLS=SMPLS-RBLK
22200 C LBLK AND RBLK ARE EQUAL
22300 CCC ISAM=ISAM-LBLK
22400 264 IF(I(8))290,290,291
22500 290 M3=MOUT+I5-1
22600 MSAMP=I5
22700 GO TO 292
22800 291 M3=MOUT+(2*I5)-1
22900 MSAMP=2*I5
23000 292 DO 267N1=MOUT,M3
23100 267 ROUT(N1)=0
23200 GO TO (268,265),IREST
23300
23400 268 DO 270 NS1=1,NLIM,NPAR
23500 IF(RNT(NS1)+1)271,270,271
23600 C GO THROUGH UNIT GENERATORS IN INSTRUMENT
23700 271 I3=NS1
23800 IGEN=RNT(NS1)
23900 IGEN=IDEF(IGEN)
24000 272 I6=IGEN
24100 294 CALL FORSAM
24200 295 IGEN=INS(IGEN+1)
24300 IF(INS(IGEN))270,270,272
24400 270 CONTINUE
24500 265 CALL SAMOUT(IDSK ,MSAMP)
24600 IF(SMPLS-0.5)247,247,266
24700 CCC IF(ISAM)247,247,266
24800 END
24900
25000 CDATA3 PASS 3 DATA INPUTING ROUTINE
25100 SUBROUTINE DATA (N)
25200 COMMON I(1)/P/ P(1) /FINOUT/JPEAK,IPEAK /IFIRST/IFIRST,IDT
25300 COMMON /DEVS/ID1,ID21,JTYPE,KIN,KOUT /JP/JPRNT
25400 EQUIVALENCE (K,I),(P2,P(2))
25500 CALL TRANS(IDT)
25600 IF(JPRNT.LT.0)GO TO 3
25700 C DON'T TYPE BEGIN TIMES IF INPUT IS BEING TYPED OUT. (JPRNT=-1)
25800 IF(P(1).EQ.1)WRITE(JTYPE,1)P2
25900 3 IF(IPEAK.LE.JPEAK)RETURN
26000 WRITE(JTYPE,2)IPEAK
26100 JPEAK=IPEAK
26200 C TYPES OUT EACH NEW PEAK AMPL.
26300 RETURN
26400 1 FORMAT('+',F9.2,$)
26500 2 FORMAT(/' AMPL=',I5,$)
26600 END
26700
26800 SUBROUTINE FROUT3(IDSK)
26900 C TERMINATE OUTPUT
27000 COMMON /DEVS/ID1,ID21,JTYPE,ID23,KOUT
27100 COMMON /ROUT/ROUT(1) /FINOUT/JPEAK,IPEAK /CONV/ICONV
27200 DO 1 K=1,512
27300 1 ROUT(K)=0
27400 CALL SAMOUT(IDSK,512)
27500 IF(JPEAK.LT.IPEAK)JPEAK=IPEAK
27600 WRITE(JTYPE,10)JPEAK
27700 C NOW CLOSE OFF THE FILE
27800 IF(ICONV.LT.0)GO TO 3
27900 CALL CLOSIT(ID23)
28000 CALL EXIT
28100 RETURN
28200 3 CALL FINEXT
28300 C****** TEMPORARY *********
28400 IF(KTYPE.EQ.0)GO TO 2
28500 COMMON I(513)
28600 COMMON /INS/INS(300),IDEF(15) /NT/RNT(700)
28700 CALL OFILE(24,'SAM')
28800 WRITE(24,4)IDEF
28900 WRITE(24,4)INS
29000 WRITE(24,5)RNT
29100 WRITE(24,4)I
29200 CALL EXIT
29300 4 FORMAT(8I10)
29400
29500 5 FORMAT(8F10.4)
29600 2 CALL PLAY
29700 RETURN
29800 10 FORMAT (/' PEAK AMPLITUDE WAS ',I6)
29900 END